package Util;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;

public class Rules {
    //特殊清理规则
    public static HashMap<String, String> specialCleaning =new HashMap<>();

    //指标对象名称替换规则
    public static HashMap<String, String> indicator_Matching_Rules = new HashMap<>();
    //指标对象名称不替换！！
    public static ArrayList<String> indicator_No_Rules = new ArrayList<>();

    //禁用置空指标对象规则
    public static ArrayList<String> disableIndicator = new ArrayList<>();
    public static HashSet<MyPair<String, String>> pairs = new HashSet<>();


    /**
     * 特殊清理
     */
    static {
        //专科去 “类” 本科不去
        specialCleaning.put("各学院口腔医学类能力达成度","各学院口腔医学能力达成度");
        specialCleaning.put("各学院口腔医学类职业素质达成度","各学院口腔医学职业素质达成度");
        specialCleaning.put("各学院药学类能力达成度","各学院药学能力达成度");
        specialCleaning.put("各学院口腔医学类知识达成度","各学院口腔医学知识达成度");
        specialCleaning.put("各学院药学类知识达成度","各学院药学知识达成度");
        specialCleaning.put("各学院临床医学类知识达成度","各学院临床医学知识达成度");
        specialCleaning.put("各学院临床医学类职业素质达成度","各学院临床医学职业素质达成度");

        //加 类
        specialCleaning.put("中医各项能力重要度及达成度","中医类各项能力重要度及达成度");
        specialCleaning.put("中药学各项能力重要度及达成度","中药学类各项能力重要度及达成度");
        specialCleaning.put("中医各项知识重要度及达成度","中医类各项知识重要度及达成度");
        specialCleaning.put("中药学各项知识重要度及达成度","中药学类各项知识重要度及达成度");
        specialCleaning.put("中医各项职业素质重要度及达成度","中医类各项职业素质重要度及达成度");
        specialCleaning.put("中药学各项职业素质重要度及达成度","中药学类各项职业素质重要度及达成度");

        //去 类
        specialCleaning.put("临床药学类各项“思想政治与职业素养”重要度及达成度","临床药学各项“思想政治与职业素养”重要度及达成度");
        specialCleaning.put("各学院临床药学类“思想政治与职业素养”达成度","各学院临床药学“思想政治与职业素养”达成度");
        specialCleaning.put("临床药学类各项“创新创业意识与能力”重要度及达成度","临床药学各项“创新创业意识与能力”重要度及达成度");
        specialCleaning.put("各学院临床药学类“创新创业意识与能力”达成度","各学院临床药学“创新创业意识与能力”达成度");
        specialCleaning.put("各学院临床医学类能力达成度","各学院临床医学能力达成度");

        //(一流专业)
        specialCleaning.put("商科能力达成度","商科能力达成度（一流专业）");
        specialCleaning.put("工程能力达成度","工程能力达成度（一流专业）");
        specialCleaning.put("学术能力达成度","学术能力达成度（一流专业）");
        specialCleaning.put("医学能力达成度","医学能力达成度（一流专业）");
        specialCleaning.put("教师评价综合分析","教师评价综合分析（一流专业）");
        specialCleaning.put("实习实践综合分析","实习实践综合分析（一流专业）");
        specialCleaning.put("核心课程满足度","核心课程满足度（一流专业）");
        specialCleaning.put("各专业主要行业需求（两届合并）", "主要行业需求（两届合并）（一流专业）");
        specialCleaning.put("各专业主要职业需求（两届合并）", "主要职业需求（两届合并）（一流专业）");
    }

    /**
     * 不替换的特殊指标
     */
    static {
        indicator_No_Rules.add("部分缺失专业毕业生的就业质量主要指标及样本（研究型）");
        indicator_No_Rules.add("部分缺失专业毕业生的就业质量主要指标及样本（非研究型）");
        indicator_No_Rules.add("各专业毕业生与任课教师课下交流程度");
        indicator_No_Rules.add("各学院毕业生与任课教师课下交流程度");
        indicator_No_Rules.add("各专业毕业生与任课教师课下交流程度（两届合并）");
        indicator_No_Rules.add("各专业毕业生与任课教师课下交流程度");
        indicator_No_Rules.add("本校毕业生读研院校类型分布");
        indicator_No_Rules.add("各专业毕业生的毕业去向落实率");
    }
    /**
     * 更换搜索指标名称
     */
    static {
        //整体替换
        indicator_Matching_Rules.put("应届毕业生对母校的推荐度", "应届毕业生对母校推荐度");
        indicator_Matching_Rules.put("应届毕业生对母校的满意度", "应届毕业生对母校满意度");
        indicator_Matching_Rules.put("各专业中医职业素质达成度", "各专业中医类职业素质达成度");
        indicator_Matching_Rules.put("各专业中医知识达成度", "各专业中医类知识达成度");
        indicator_Matching_Rules.put("各专业中医能力达成度", "各专业中医类能力达成度");
        indicator_Matching_Rules.put("各专业中药学职业素质达成度", "各专业中药学类职业素质达成度");
        indicator_Matching_Rules.put("各专业中药学知识达成度", "各专业中药学类知识达成度");
        indicator_Matching_Rules.put("各专业中药学能力达成度", "各专业中药学类能力达成度");
        indicator_Matching_Rules.put("各专业临床医学职业素质达成度", "各专业临床医学类职业素养达成度");
        indicator_Matching_Rules.put("各专业口腔医学职业素质达成度", "各专业口腔医学类职业素质达成度");
        indicator_Matching_Rules.put("各专业口腔医学知识达成度", "各专业口腔医学类知识达成度");
        indicator_Matching_Rules.put("专业口腔医学能力达成度", "各专业口腔医学类能力达成度");
        indicator_Matching_Rules.put("临床药学类各项能力重要度及达成度", "临床药学各项能力重要度及达成度");
        indicator_Matching_Rules.put("各学院临床药学类能力达成度", "名学院临床药学能力达成度");
        indicator_Matching_Rules.put("临床药学类各项知识重要度及达成度", "临床药学各项知识重要度及达成度");
        indicator_Matching_Rules.put("各学院临床药学类知识达成度", "各学院临床药学知识达成度");
        indicator_Matching_Rules.put("工程类专业各项毕业要求达成度", "工程类专业12项毕业要求达成度");
        indicator_Matching_Rules.put("应届毕业生对母校的推荐度变化趋势", "应届毕业生对母校推荐度变化趋势");
        indicator_Matching_Rules.put("应届毕业生对母校推荐度变化趋势", "应届毕业生对母校推荐度变化趋势");
        indicator_Matching_Rules.put("各专业毕业生在高水平研究生院读书的比例", "各专业在高水平研究生院读书的比例");
        indicator_Matching_Rules.put("各专业临床医学类各项职业素养达成度", "各专业临床医学类职业素养达成度");
        indicator_Matching_Rules.put("教师教学改进需求", "教师授课方面需要改进的地方");
        indicator_Matching_Rules.put("各专业毕业生对教师授课效果改进需求", "各专业教师授课方面重点需要改进的地方");
        indicator_Matching_Rules.put("各项通用能力的重要度、达成度", "各项通用能力的重要度及达成度");
        indicator_Matching_Rules.put("对岗位不适应的原因", "毕业生不适应就业岗位的原因");
        indicator_Matching_Rules.put("参加国内研究生考试的比例", "参加过国内研究生考试的比例");
        indicator_Matching_Rules.put("毕业生读研院校类型分布", "本校毕业生读研院校类型分布");
        indicator_Matching_Rules.put("各专业毕业生的毕业去向", "各专业毕业去向分布");



        //部分替换
        indicator_Matching_Rules.put("部分缺失专业毕业生的", "本校部分缺失专业毕业生的");
        indicator_Matching_Rules.put("毕业生与任课教师课下交流程度", "与任课教师课下交流频度");


    }

    /**
     * 置空的指标对象
     */
    static {
        //测试临时缺失
        disableIndicator.add("各专业主要职业需求");

        //缺失关键字
        disableIndicator.add("定义");
        disableIndicator.add("构成情况");
        disableIndicator.add("素养提升比例");

        //首尾匹配 各专业xxx达成度  可能会在 indicator_Matching_Rules 里
        pairs.add(new MyPair<>("各专业", "达成度"));
        pairs.add(new MyPair<>("各专业", "相关度"));
    }

    /**
     * 指标对象名称清理
     *
     * @param str
     * @return
     */
    public static String indicatorNameCleaning(String str) {
        if (!indicator_No_Rules.contains(str)&&indicator_Matching_Rules.keySet().stream().anyMatch(str::contains)) {
            return indicator_Matching_Rules.entrySet()
                    .stream().reduce(str, (s, e) -> s.replace(e.getKey(), e.getValue()), String::concat);
        }
        return str;
    }

    /**
     * 判断是否为 禁用置空的指标对象
     *
     * @param content
     * @return
     */
    public static boolean disable_Indicator(String content) {

        if (indicator_Matching_Rules.keySet().stream().noneMatch(content::contains) && disableIndicator.parallelStream().anyMatch(content::contains)) {
            return true;
        } else {
            for (MyPair pair : pairs) {
                if (content.startsWith(pair.getFirst()) && content.endsWith(pair.getLast())) {
                    return true;
                }
            }
            return false;
        }
    }


    static class MyPair<T, U> {
        T first;
        U last;

        public MyPair(T f, U l) {
            this.first = f;
            this.last = l;
        }

        public String getFirst() {
            return first.toString();
        }

        public String getLast() {
            return last.toString();
        }
    }
}
